﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoVuelos.Acceso_a_Datos.Mysql;
using ProyectoVuelos.Entidades;
using ProyectoVuelos.Logica.Excepciones;

namespace ProyectoVuelos.Logica.CompraVuelos
{
    public class LogicaCompraVuelos
    {

        #region Atributos
            List<BoletoAereo> listaBoletos;
            Mensaje msn;
            Random aleatorio;
            MySQLCompraVuelo _persistidor;
        #endregion

        

        public LogicaCompraVuelos()
        {
            this.listaBoletos = new List<BoletoAereo>();
            this.msn = new Mensaje();
            this.aleatorio = new Random();
            this._persistidor = new MySQLCompraVuelo();
        }

        #region Metodos
        public BoletoAereo ClaseBoleto(Usuario pasajero,Compra c,string tipoBoleto,string tipoTarifa)
        //METODO PARA INSTANCIAR Y VALIDAR UNA CLASE BOLETO
        {
            try
            {
                //FALTA VALIDAR LOS DATOS

                int fechaSistema = DateTime.Today.Year;
                Random aleatorio = new Random();
                BoletoAereo boleto = null;
                Asiento asiento= new Asiento();
                //FALTAN LOS ATRIBUTOS TIPO DE ASIENTO Y NUMERO DE ASIENTO.
                boleto = new BoletoAereo(Convert.ToString(aleatorio.Next(0, 99999)), tipoBoleto, asiento, c.Vuelo.GetTarifa(tipoTarifa).Precio, pasajero, c);
                return boleto;
            }
            catch (MethodAccessException ex)
            {
                throw new LogicaCompraVuelosExcepcion("ERROR:Se detecto un error durante el acceso a una clase: " + ex.Message);
            }
            catch (NullReferenceException)
            {
                throw new LogicaCompraVuelosExcepcion("ERROR:No esta permitido manipular o acceder a un objeto nulo");
            }
            finally
            {
                
            }

        }


        public Usuario ClaseUsuario(string primerNombre,string segundoNombre,string primerApellido,string segundoApellido,string pasaporte,DateTime fechaNacimiento)
        //METODO PARA INSTANCIAR Y VALIDAR UNA CLASE USUARIO
        {
            //NOTA:EN ESTE APARTADO PODRIA VALIDARSE LA DATA PROVENIENTE DEL USUARIO
            try
            {
                Usuario persona = new Usuario(pasaporte, "0000000", primerNombre + segundoNombre, primerApellido + primerNombre, fechaNacimiento, 'M', "usuario@dominio.com", "555555", null);
                return persona;
            }
            catch (NullReferenceException)
            {
                throw new LogicaCompraVuelosExcepcion("ERROR:No esta permitido manipular o acceder a un objeto nulo");
            }

        }

        public Vuelo ClaseVuelo()
        //METODO PARA INSTANCIAR Y VALIDAR UNA CLASE VUELO
        {
            //NOTA:EN ESTE APARTADO PODRIA VALIDARSE LA DATA PROVENIENTE DEL USUARIO

         
            return null;
        }


        public Mensaje AgregarCompraVuelo(List<Usuario> pasajeros, string tipoBoleto, int identificadorCuenta, Vuelo vuelo, Pago pago)
        //METODO PARA AGREGAR UNA COMPRA DE VUELO TIPO IDA AL SISTEMA
        {
            try
            {
                #region Datos Ficticios
                string ano = Convert.ToString(DateTime.Now.Year);
                string mes = Convert.ToString(DateTime.Now.Month);
                string dia = Convert.ToString(DateTime.Now.Day);
                string fecha = ano + "/" + mes + "/" + dia;
                Compra c = new Compra(fecha, pago, vuelo);
                #endregion

                this.msn = _persistidor.registrarCompraIda(c, identificadorCuenta);
                if (msn.TipoMensaje.Equals('A') && msn.Codigo.Equals(100))
                {
                    c.Codigo = this.msn.Contenido;
                    for (int i = 0; i < pasajeros.Count(); i++)
                    {
                        BoletoAereo aux = new BoletoAereo(Utilitaria.GenerarCodigoBoleto(), tipoBoleto, new Asiento(), vuelo.GetTarifa("adulto").Precio, pasajeros.ElementAt(i), c);
                        this.msn = _persistidor.registrarBoleto(aux, c);
                        this.listaBoletos.Add(aux);
                    }
                    pago.MontoPago = c.CalcularMontoTotal(listaBoletos);//LOGICA EXTRANA. DEBE CALCULARSE EL MONTO TOTAL ANTES.
                    this.msn = _persistidor.registrarPago(c, pago);
                    this.msn = _persistidor.registrarFactura(this.listaBoletos, identificadorCuenta, pago.MontoPago);

                }
            }
            catch (NullReferenceException)
            {
                this.msn.Contenido = "ERROR CRITICO DE SISTEMA:No esta permitido manipular o acceder a un objeto nulo";
                this.msn.Codigo = 200;
                this.msn.TipoMensaje = 'B';
            }
            finally
            {

            }
            return msn;
        }
        #endregion

    }
}